#include "loop_queue.h"

int create_queue(queue_t **p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    *p = (queue_t *)malloc(sizeof(queue_t));
    if(NULL == *p){
        printf("内存分配失败\n");
        return -1;
    }
    // 不必非得置0 只需让rear和front相等即可 但是初始化时要确保值的范围在[0, N-1]
    (*p)->front = (*p)->rear = 0;
    return 0;
}

int clean_queue(queue_t *my_queue){
    if(NULL == my_queue){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    // 只需要让 rear 和 front 相等即可
    my_queue->rear = my_queue->front;
    return 0;
}

int destroy_queue(queue_t **my_queue){
    if(NULL == my_queue || NULL == *my_queue){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    free(*my_queue);
    *my_queue = NULL;
    return 0;
}

// 返回1 满了  返回0 没满
int is_full(queue_t *my_queue){
    if(NULL == my_queue){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    return (my_queue->rear+1) % N == my_queue->front ? 1 : 0;
}

int push_queue(queue_t *my_queue, int num){
    if(NULL == my_queue){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(is_full(my_queue)){
        printf("队列满 入队列失败\n");
        return -1;
    }
    my_queue->data[my_queue->rear] = num;
    my_queue->rear = (my_queue->rear+1) % N;
    return 0;
}

// 返回1 空了  返回0 没空
int is_empty(queue_t *my_queue){
    if(NULL == my_queue){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    return my_queue->front == my_queue->rear ? 1 : 0;
}

int pop_queue(queue_t *my_queue, int *buff){
    if(NULL == my_queue || NULL == buff){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(is_empty(my_queue)){
        printf("队列空 出队列失败\n");
        return -1;
    }
    *buff = my_queue->data[my_queue->front];
    my_queue->front = (my_queue->front+1) % N;
    return 0;
}

int print_queue(queue_t *my_queue){
    if(NULL == my_queue){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    int i = 0;
    // 注意不要写成 for(i = front; i < rear; i++)
    // 因为循环队列中 front 可能本身就是比 rear 大的
    for(i = my_queue->front; i != my_queue->rear; i = (i+1)%N){
        printf("%d ", my_queue->data[i]);
    }
    printf("\n");
    return 0;
}



// 入栈
int my_push_stack(loop_t *A,loop_t*B,int num){
   if(NULL == A||NULL==B){
        printf("入参为NULL,请检查\n");
        return -1;
    }
    int temp=0;
    if(!is_full(A)){
        push_queue(A,  num);
        while(!pop_queue(B,&temp)){
            pop_queue(B, &temp);
            push_queue(A, temp);
            temp=0;
        }
    }else{
        push_queue(B,  num);
        temp=0;
        while(!pop_queue(A,&temp)){
            pop_queue(A, &temp);
            push_queue(B, temp);
            temp=0;
        }
    }
return  0
    
}

// 出栈
int my_pop_stack(loop_t *A,loop_t *B, int *buff){
    if(NULL == A||NULL==B ||NULL==buff){
        printf("入参为NULL,请检查\n");
        return -1;
    }
    if(!is_empty(A)){
        pop_queue(A,  buff);
    }else{
        if(!is_empty(B)){
            pop_queue(B,  buff);
        }else{
return -1;
        }
    }
    return 0;
}

